/*
 * ape.h
 *
 *  Created on: 20/07/2012
 *      Author: annibal
 */

#ifndef APE_H_
#define APE_H_

#include "constantes.h"
#include "automato.h"
#include "pilha.h"

typedef struct {
	char nome;						/* nome da submáquina */
	Automato AF;					/* autômato finito modificado para poder realizar transções de chamada e retorno */
} Submaquina;

typedef struct {
	int numeroSubmaquinas;			/* número de submáquinas do APE */
	Submaquina *submaquinas;		/* lista das submáquinas do APE */
	int tamAlfabeto;				/* tamanha do alfabeto de entrada do APE */
	char *alfabeto;					/* lista dos símbolos do alfabeto de entrada do APE */
	Pilha *pilha;					/* pilha do APE */
	Submaquina *submaquinaInicial;	/* submáquina inicial do APE */
	Submaquina *submaquinaAtual;	/* submáquina atual do APE */
	char token;						/* token a ser analisado pelo APE */
} APE;

void criaAPE(FILE *espec, APE *M);
void criaSubmaquina(int tamAlfabeto, char *alfabeto, int numeroSubmaquinas,
		char *nomeSubmaquinas, FILE *espec, Submaquina *a);
void criaTransicoesSM(int numeroSubmaquinas, char *nomeSubmaquinas, FILE *espec,
		Submaquina *a);
int adicionaTransicaoSM(int numeroSubmaquinas, char *nomeSubmaquinas,
		FILE *espec, Submaquina *a);
void geraAlfabetoAPE(FILE *espec, APE *M);
void recebeTokenAPE(char token, APE *M);
char analisaToken(APE *M, char imprime, FILE *saida);
Submaquina *encontraSubmaquina(Estado *estado, APE *M);
int aceita(APE *M);
void inicializaAPE(APE *M);

#endif /* APE_H_ */
